前回はGoogle App Engine(GAE)のJavaプロジェクトの作成・公開をEclipse上で行うための環境構築方法について確認した。今回はEclipse上でGAEプロジェクトの基本構造を確認する。
■ GAE SDKバージョンと仕様書
まずはGAEで利用する仕様書を確認する。GAE SDKのバージョンは新規プロジェクトを作成した際のJARライブラリのファイル名称(WEB-INF/lib/appengine-api-○○.jar(○○はバージョン番号))で確認できる。現時点(2015年11月)においる最新バージョンは1.9.25である。GAE SDK1.9.25では、Java・Servlet・JSPの対応バージョンと仕様書は以下のとおりである。
■ GAEのJava環境について
Google App Engineを動作させるJava環境には以下の二つがある。本講座では無料で利用可能なSandbox環境を利用する。
◇ Sandbox
無料で利用できるJava環境。以下の制限がある。
- ファイル書込はできない(読込は可)
- リクエストへの返答は数秒以内に終わる必要がある
- スレッド生成に制限あり
- その他、いくつかの関数利用に制限がある。使える関数(ホワイトリスト)は*2参照
◇ Managed VM
sandboxの制限をなくしたJava環境。現在(2015年11月)はベータ版として稼動中。利用するためには課金を有効にする必要がある(つまり有料)。
■ GAEアプリケーションの動作イメージ
上記でも記述しているが、GAEではHTMLとServletとJSPを組み合わせてプロジェクトを作成できる。プロジェクトの動作イメージは以下のとおりである。GAEは基本的にTomcat等と同じwebコンテナであるが、DBがBig Tableに限定される(有料のGoogle Cloud Platformを利用すればRDBも利用可能)こと、Google認証等が含まれるGAE APIが利用可能であることが異なる。
- webブラウザはURLを指定して、ハイパーリンクによるページ遷移要求やボタン押下イベントの発生をGoogle App Engineに知らせる
- Google App Engineでは、web.xmlを見てURLに対応して呼び出すプログラム(ファイル)を発見する。呼び出されたプログラムはGoogle App Engine上でJavaコードを処理した後、webブラウザに結果画面を返す。このとき、Google App Engine上のプログラムはweb.xmlを見て、他のプログラムを起動すること(リダイレクト)も可能である
- ServletやJSP内のJava記述からはDBの利用が可能である
GAEにおいてもStrutsやSpring、Slim3といったMVCフレームワークを利用することもできるが、本講座ではフレームワークを導入しない(本講座ではどのフレームワークでも利用可能なGAE APIの利用方法を確認する)。フレームワークの導入・利用については別記事で確認することとする。
■ GAEプロジェクトの基本構造(フォルダ構造)
GAEプロジェクトの基本的なフォルダ構造を以下に示す。なおEclipse上で新規GAEプロジェクトを作成する方法については、前回の記事を参照のこと。HTML・JSPファイルはwarフォルダ以下に配置し、Servletクラスはsrc以下に配置する形になる。また、URLに対応する呼出HTML,JSP,Servletクラス名はweb.xmlに記述する。
フォルダ名 |
内容 |
src |
Servletで利用するJavaファイルを格納する |
war |
web上に公開するファイルを格納する。
直下がルート・ディレクトリに相当する |
war/WEB-INF |
ライブラリや設定ファイルを格納する。
web上からアクセスはできない |
ファイル名 |
内容 |
WEB-INF/appengine-web.xml |
デプロイメント記述子。
アプリケーション全体の設定を記述する |
WEB-INF/web.xml |
デプロイメント記述子。
URLに対応する呼出HTML,JSP,Servletクラス名を記述する |
■ GAEサンプル・プログラム
上記フォルダ構成でHTML,JSP,Servletを利用するサンプル・プログラムを以下に示す。
◇サンプル・コードと解説
appengine-web.xml
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
<application>karu-lab</application>
<version>1</version>
<threadsafe>true</threadsafe>
</appengine-web-app>
アプリケーションの全体設定を記述している。applicationタグでGAEプロジェクトIDを、versionタグでアプリケーションのバージョンIDを指定する。threadsafeタグにtrueを指定するとマルチ・スレッド環境での動作モードに切り替え、サーバ応答速度の高速化が可能。ただし、作成したプロジェクトがスレッド・セーフである場合にのみtrueに設定できる。
web.xml
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>TestGAE</servlet-name>
<servlet-class>com.appspot.karu_lab.TestGAEServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestGAE</servlet-name>
<url-pattern>/testgae</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
URLと呼出ファイルの対応関係を記述している。servletタグとservlet-mappingタグは対になっており、あるservlet-nameに対してクラス・ファイルのパス(servlet-classタグ)と、対応するURL(url-patternタグ)を設定している。servletタグとservlet-mappingタグはサーブレットの数だけ記述する。welcome-fileタグではホーム・ページとして表示するHTMLもしくはJSPファイルを指定する。
index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Hello App Engine</title>
</head>
<body>
hello world!(HTML)<br />
<a href="./testgae">Servlet呼出</a><br />
<a href="./test.jsp">JSP呼出</a>
</body>
</html>
ホーム・ページとなるHTMLファイル。ServletとJSPへのリンクを張っている。
TestGAEServlet
package com.appspot.karu_lab;
import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class TestGAEServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.getWriter().println("hello world!(Servlet)");
}
}
URL「/testdae」を呼び出した場合に起動するServletを記述したクラス・ファイル。HttpServlet::doGetGET関数には、GETリクエストで呼び出した場合のレスポンスを記述する。今回は単純なテキスト「hello world!(Servlet)」を返している。
Test.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
hello world!(JSP)
</body>
</html>
URL「/test.jsp」を呼び出した場合に起動するJSPファイル。今回は単純なHTML文書でテキスト「hello world!(JSP)」を出力している。
◇ 実行結果
Eclipse上(ローカル)でサンプル・プログラムを実行し、ブラウザから以下URLにアクセスした場合の実行結果を以下に示す。
http://localhost:8888
http://localhost:8888/testgae
http://localhost:8888/test.jsp
◇ その他
Eclipseで新規GAEプロジェクトを作成した際に以下のファイルも自動生成される。それぞれのファイルの役割は以下のとおりであり、利用は任意である。
ファイル名 |
内容 |
src/logging.properties |
ロガー(org.apache.log4j.Loggerクラス)利用時の設定ファイル |
src/META-INF/jdoconfig.xml |
Java Data Objects(JDO)利用時の設定ファイル |
src/META-INF/persistence.xml |
Java Persistence API (JPA) 利用時の設定ファイル |
war/WEB-INF/logging.properties |
ロガー(java.util.loggingクラス)利用時の設定ファイル |
■ 参照
- Issue 1506: JSP spec. App Engine SDK supports is different between API JAR and implementation JAR
- GAE ドキュメント:The JRE Class White List
改訂履歴・2016年4月11日 一部改訂。『GAEアプリケーションの動作イメージ』が分かりにくかったので記述修正